const Mock = require('mockjs')
const jwt = require('jsonwebtoken')
let { fileList, list } = require('./mock')
const multipart = require('connect-multiparty');
const multipartMiddleware = multipart();
const OSS = require('ali-oss')
const path = require("path")
// 用户数据
const userList = [{
	"username": "admin",
	"password": "admin",
	"avator": Mock.mock('@image(50x50, @color, 头像)'),
	"nickname": Mock.mock('@cname'),
	"id": Mock.mock("@id")
}, {
	"username": "test",
	"password": "test",
	"avator": Mock.mock('@image(50x50, @color, 头像)'),
	"nickname": Mock.mock('@cname'),
	"id": Mock.mock("@id")
}]
const bodyParser = require('body-parser')
const key = 'qwldqkmwdlq'
module.exports = app => {
	app.use(bodyParser.json());
	// 登录接口
	app.post('/api/login', (req, res) => {
		// 获取用户名和密码
		const { username, password } = req.body;
		// 查询用户
		const user = userList.find(v => v.username === username && v.password === password)
		if (user) {
			res.send({
				code: 200,
				data: {
					nickname: user.nickname,
					avator: user.avator,
					id: user.id,
					token: jwt.sign({
						nickname: user.nickname,
						avator: user.avator,
						id: user.id,
					}, key)
				},
				message: '登录成功'
			})
		} else {
			res.send({
				code: 401,
				data: null,
				message: '账户密码错误， 请重新输入'
			})
		}

	})
	// 文件列表接口
	app.get('/api/file/list', (req, res) => {
		res.send({
			code: 200,
			data: fileList,
			message: '数据请求成功'
		})
	})

	// 文件上传接口
	app.post('/api/upload', multipartMiddleware, (req, res) => {
		const filename = req.files.file.originalFilename
		const filepath = req.files.file.path
		const size = req.files.file.size
		const extname = req.files.file.originalFilename.slice(req.files.file.originalFilename.lastIndexOf('.'));


		const client = new OSS({
			// yourregion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
			region: 'oss-cn-hangzhou',
			// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
			accessKeyId: 'LTAI5tGavmQA24V6H9Vvu2eW',
			accessKeySecret: 'MWa96jcEbznlw7bL9jchapo5hA1Cne',
			// 填写Bucket名称。
			bucket: '2005a-10',
		});

		try {
			// 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
			// 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
			const result = client.put(filename, path.normalize(filepath));

			result.then(resp => {

				fileList.push({
					filename,
					extname,
					url: resp.url,
					size,
					id: Mock.mock('@id')
				})

				res.send({
					code: 200,
					data: resp,
					message: '上传成功'
				})
			})

		} catch (e) {
			console.log(e);
		}
	})

	// 获取列表
	app.get('/api/list', (req, res) => {
		// 获取搜索内容
		const { value } = req.query;
		// 搜索内容是否存在
		if (value) {
			// 存在搜索
			const newList = list.filter(v => {
				// 筛选所有符合条件的键值
				// 条件: 模糊搜索
				return Object.values(v).some(v => v.includes(value))
			})
			res.send({
				code: 0,
				data: newList,
				message: '数据请求成功~'
			})
		} else {
			// 不存在直接返回所有数据
			res.send({
				code: 200,
				data: list,
				message: '数据请求成功~'
			})
		}
	})

	// 删除
	// 支持多个删除和单个删除
	// id = 'id1, id2, id3, id4'
	app.delete('/api/list/:id', (req, res) => {
		// 获取动态路由参数
		const { id } = req.params
		// 删除
		list = list.filter(v => !id.includes(v.id))
		res.send({
			code: 200,
			data: list,
			message: '数据删除成功~'
		})
	})

	// 添加
	app.post('/api/list', (req, res) => {
		const { address, tel, name, state, tips } = req.body;
		const id = Mock.Random.id();
		list.unshift({
			address, tel, name, state, tips, id
		})
		res.send({
			code: 200,
			data: null,
			message: '数据添加成功~'
		})
	})

	// 更新 要求传递路由路由id
	app.post('/api/list/:id', (req, res) => {
		// 获取动态路由id
		const { id } = req.params;
		// 查找该项id所在的数据
		const item = list.find(v => v.id === id);

		if (item) {
			// 新数据覆原数据
			Object.assign(item, req.body);
			res.send({
				code: 200,
				message: '修改数据成功~',
				data: null
			})
		} else {
			res.send({
				code: -1,
				message: '修改的数据不存在',
				data: null
			})
		}
	})
}
